package persistence.db;

import java.sql.*;
import java.util.HashMap;

/**
 * Connecteur à la base de données
 * 
 */
public class DatabaseConnector {
	private static final DatabaseConnector instance = new DatabaseConnector();

	private Connection dbConnection;

	// Nom du serveur
	private String serverName;

	// Numéro du port
	private String portNumber;

	// Nom de la base de données
	private String sid;

	// Adresse de connexion de la BD
	private static String url;

	// Login de connexion
	private static String username;

	// Mot de passe de la connexion
	private static String password;

	private HashMap<ResultSet, Statement> openResultSets;

	private DatabaseConnector() {
		/*
		 * TODO charger les paramètres de connexion à partir d'un fichier de
		 * configuration
		 */
		serverName = "phoenix.peip.fr";
		portNumber = "1521";
		sid = "XE";
		url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + "/" + sid;
		username = "teamtime";
		password = "teamtime";

		openResultSets = new HashMap<ResultSet, Statement>();

		connect();
	}

	/**
	 * Établi la connexion avec la base de données
	 */
	private void connect() {
		try {
			// Load the JDBC driver
			String driverName = "oracle.jdbc.driver.OracleDriver";
			Class.forName(driverName);

			// Create a connection to the database
			dbConnection = DriverManager.getConnection(url, username, password);
		} catch (ClassNotFoundException e) {
			System.out.println("Could not find the database driver");
		} catch (SQLException e) {
			System.out.println("Could not connect to the database " + url);
		}

	}

	public void closeResultSet(ResultSet rset) {
		Statement openStatement = openResultSets.get(rset);
		try {
			rset.close();
			openStatement.close();
		} catch (SQLException e) {
			System.err.println("Cannot close the statement.");
			e.printStackTrace();
		}
	}

	public ResultSet execute(String query) {
		try {
			Statement statement = dbConnection.createStatement();
			ResultSet rset = statement.executeQuery(query);
			openResultSets.put(rset, statement);
			return rset;

		} catch (SQLException e) {
			System.err.println("Erreur d'execution de la requete " + query);
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @return L'instance unique du connecteur
	 */
	public static DatabaseConnector getInstance() {
		return instance;
	}

}
